package com.back.controller;

import com.back.common.utils.Result;
import com.back.common.utils.SecurityUtil;
import com.back.security.annotation.RequireRole;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 角色权限测试控制器
 * 用于演示不同的权限控制方式
 */
@RestController
@RequestMapping("/api/role-test")
@Api(tags = "角色权限测试接口")
public class RoleTestController {

    /**
     * 使用Spring Security自带的@PreAuthorize注解控制权限
     */
    @GetMapping("/admin-only")
    @ApiOperation("仅管理员可访问 - 使用@PreAuthorize")
    @PreAuthorize("hasRole('ADMIN')")
    public Result adminOnly() {
        return Result.ok().message("您拥有管理员权限").data("username", SecurityUtil.getCurrentUsername());
    }
    
    /**
     * 使用自定义的@RequireRole注解控制权限
     */
    @GetMapping("/employer-only")
    @ApiOperation("仅企业用户可访问 - 使用@RequireRole")
    @RequireRole("EMPLOYER")
    public Result employerOnly() {
        return Result.ok().message("您拥有企业用户权限").data("username", SecurityUtil.getCurrentUsername());
    }
    
    /**
     * 要求同时拥有多个角色
     */
    @GetMapping("/admin-and-employer")
    @ApiOperation("需要同时拥有管理员和企业用户权限")
    @RequireRole(value = {"ADMIN", "EMPLOYER"}, allRolesRequired = true)
    public Result adminAndEmployer() {
        return Result.ok().message("您同时拥有管理员和企业用户权限").data("username", SecurityUtil.getCurrentUsername());
    }
    
    /**
     * 只需要拥有其中一个角色即可
     */
    @GetMapping("/admin-or-job-seeker")
    @ApiOperation("拥有管理员或求职者权限均可访问")
    @RequireRole(value = {"ADMIN", "JOB_SEEKER"})
    public Result adminOrJobSeeker() {
        return Result.ok().message("您拥有管理员或求职者权限").data("username", SecurityUtil.getCurrentUsername());
    }
    
    /**
     * 所有已认证用户均可访问
     */
    @GetMapping("/authenticated")
    @ApiOperation("所有已认证用户均可访问")
    public Result authenticated() {
        return Result.ok().message("您已通过认证").data("username", SecurityUtil.getCurrentUsername());
    }
} 